La complessità computazione serve per stabilire il costo di un algoritmo in termini di numero di operazioni fatte in RAM e dalla memoria occupata durante la sua esecuzione. Quando andiamo parliamo di costo computazionale prendiamo in esame
- il caso peggiore: ovvero il costo massimo tra tutti i possibili input
- il caso medio: costo mediato tra tutte le istanze di input è importante per definire un costo totale di un algoritmo definire il costo unitario di ogni singola operazione, in questo modo contando le operazioni si riesce a definire il costo totale, inoltre è necessario definire il comportamento dell’algoritmo in caso di dimensioni dell’input che tendono ad infinito e questo lo facciamo attraverso la notazione asintotica. Le notazioni principali sono:
- Grande O: denotiamo con O(g(n)) l’insieme delle funzioni
esistono delle constanti positive tale che per ogni
usando questa notazione facciamo riferimento ai casi peggiori ovvero ad un limite superiore per . Esistono diverse classe di equivalenza in cui i vari algoritmi in base alla loro complessità vengono raggruppate, le classi sono:
- Costante: 1
- Sotto-lineare:
- Lineare:
- Polinomiale:
- Esponenziale: (quello peggiore)
- Grande Beta:
- Grande Theta:
Rielaborazione
Esistono due tipi di complessità:
- complessità temporale
- complessità spaziale di seguito parleremo solo di complessità temporale: la complessità di un’algoritmo varia in base a quello che quel algoritmo fa:
- O(1): complessità constante
- O(n): complessità di un ciclo quando le sue variabili sono incrementate/decrementate si una quantità costante.
- O(n^c): c è il numero di cicli annidati in cui le variabili contatore sono incrementate/decrementate di una quantità constante
- O(log n): complessità di un ciclo quando le sue variabili sono incrementate/decrementate moltiplicandole o dividendole per una costante.
- O(log log n): complessità di un ciclo quando le sue variabili sono incrementate/decrementate esponenzialmente
Notazione asintotica
Le notazioni utilizzate vengono dette asintotiche perché studiano la complessità computazionale al tendere n (numeri di dati in input) all’infinito e sono 3:
- Notazione big O: che definisce il limite asintotico superiore ovvero il caso peggiore al tendere di all’infinito.
- Notazione Omega: che definisce il limite asintotico inferiore ovvero il caso migliore al tendere di all’infinito.
- Notazione Theta: che definisce il limite asintotico stretto ovvero una condizione più stringente alla notazione big O infatti per definire questa notazione le notazioni O e Omega devono corrispondere
Ricerca lineare
Prendendo in esame la ricerca lineare in un array di elementi possiamo dire che:
- Caso migliore: (notazione big O)
- Caso peggiore: (notazione big Beta)
- Caso medio: ?
Per riuscire a calcolare il caso medio abbiamo bisogno della funzione che ritorna la probabilità che uno specifico elemento si trovi nella posizione passata, se ogni elemento è equiprobabile, allora la funzione diventa: , e quindi per il calcolo del valore atteso:
ovvero:
da questo deduciamo che il caso medio é:
